﻿using QuanLyTiemVang.BUS;
using QuanLyTiemVang.Classes;
using QuanLyTiemVang.DAO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace QuanLyTiemVang.GUI
{
    /// <summary>
    /// Interaction logic for PhieuNhapKho.xaml
    /// </summary>
    public partial class PhieuNhapKho : Window
    {
        class PhieuNhapKhoData
        {
            public int MaSanPham { get; set; }
            public String TenSanPham { get; set; }
            public String LoaiSanPham { get; set; }
            public int SoLuong { get; set; }
            public int DonGia { get; set; }
            public decimal ThanhTien 
            {
                get { return (decimal)SoLuong * (decimal)DonGia; }                
            }
        };
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);

            // Begin dragging the window
            this.DragMove();
        }
        private List<PhieuNhapKhoData> dataPNK = new List<PhieuNhapKhoData>();
        public PhieuNhapKho()
        {
            InitializeComponent();
            dpNgayLapPhieu.SelectedDate = DateTime.Now.Date;
            dpNgayLapPhieu.IsEnabled = false;
            List<PHIEUNHAPKHO> l = PhieuNhapKhoDAO.GetAllPhieuNhapKho();
            if (l.Count == 0)
            {
                this.txtMaPhieu.Text = "0";
            }
            else
            {
                this.txtMaPhieu.Text = (l[l.Count - 1].MaPhieuNhapKho+ 1).ToString();
            }

            txtMaNhanVien.Text = CurrentUser.Instance.TaiKhoan.Id.ToString();
            txtTenNhanVien.Text = CurrentUser.Instance.TaiKhoan.TenDangNhap.ToString();
        }

        private void ClearAll()
        {
            txtMaPhieu.Text = PhieuNhapKhoDAO.GetLastMaPhieuNhapKho().ToString();
            cbSanPham.SelectedIndex = -1;
            txtLoaiSanPham.Text = "";
            txtSoLuong.Text = "";
            txtDonGia.Text = "";
            txtTongTien.Clear();
            dgPhieuNhapKho.ItemsSource = null;
            dataPNK.Clear();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            cbSanPham.ItemsSource = SanPhamDAO.GetAllSanPham().Select(m => m.TenSanPham);
            //dgPhieuNhapKho.ItemsSource = dataPNK;
        }

        private void btnThemMoiSanPham_Click(object sender, RoutedEventArgs e)
        {
            DanhSachSanPham frmSP = new DanhSachSanPham();
            frmSP.ShowDialog();
            Window_Loaded(sender, e);
            
        }

        private void cbSanPham_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if(cbSanPham.SelectedIndex!=-1)
                txtLoaiSanPham.Text = SanPhamDAO.GetAllSanPham()[cbSanPham.SelectedIndex].LOAISANPHAM.TenLoaiSanPham;
        }

        private bool CheckInput()
        {
            if(cbSanPham.SelectedIndex < 0)
            {
                MessageBox.Show("Chưa chọn sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
            if(txtSoLuong.Text=="")
            {
                MessageBox.Show("Chưa nhập số lượng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }

            if (txtSoLuong.Text == "0")
            {
                MessageBox.Show("Số lượng phải lớn hơn 0.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }

            if (txtDonGia.Text == "")
            {
                MessageBox.Show("Chưa nhập đơn giá.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }

            if (txtDonGia.Text == "")
            {
                MessageBox.Show("Đơn giá phải lớn hơn 0.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }

            return true;
        }
        private void btnThemVaoPhieuNhap_Click(object sender, RoutedEventArgs e)
        {
            if (!CheckInput())
                return;

            if (txtDonGia.Text.Length < 4)
            {
                MessageBox.Show("Đơn giá phải nhập tối thiểu là 1000 đồng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            foreach (var item in dataPNK)
            {
                if (cbSanPham.SelectedItem.ToString() == item.TenSanPham.ToString())
                {
                    MessageBox.Show("Sản phẩm đã tồn tại trong danh sách.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            List<SANPHAM> lstSP = SanPhamDAO.GetAllSanPham();
            PhieuNhapKhoData dt = new PhieuNhapKhoData()
            {
                MaSanPham = lstSP[cbSanPham.SelectedIndex].MaSanPham,
                TenSanPham = lstSP[cbSanPham.SelectedIndex].TenSanPham,
                LoaiSanPham = lstSP[cbSanPham.SelectedIndex].LOAISANPHAM.TenLoaiSanPham,
                SoLuong = int.Parse(txtSoLuong.Text),
                DonGia = int.Parse(txtDonGia.Text)
            };
            
            dataPNK.Add(dt);
            dgPhieuNhapKho.ItemsSource = null;
            dgPhieuNhapKho.ItemsSource = dataPNK;

            decimal tongTien = 0;
            foreach (PhieuNhapKhoData item in dataPNK)
            {
                tongTien += item.ThanhTien;
            }

            txtTongTien.Text = String.Format("{0:0}", tongTien);

            cbSanPham.Text = "";
            txtLoaiSanPham.Clear();
            txtDonGia.Clear();
            txtSoLuong.Clear();
        }

        private void btnLapPhieu_Click(object sender, RoutedEventArgs e)
        {
            if (dgPhieuNhapKho.ItemsSource == null)
            {
                MessageBox.Show("Chưa có thông tin các sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            MessageBoxResult result = MessageBox.Show("Bạn có chắc chắn muốn lập phiếu nhập kho với những thông tin trên không?", "Xác nhận lập phiếu", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
                return;

            //Kiểm tra báo cáo tồn
            List<BAOCAOTON> lstBaoCaoTon = BaoCaoTonDAO.SelectAllBaoCaoTon();
            int maBaoCaoTon = 0;
            if(lstBaoCaoTon != null)
            foreach (var bct in lstBaoCaoTon)
            {
                if (bct.NgayBaoCao.Value.Date.Month == DateTime.Now.Date.Month && bct.NgayBaoCao.Value.Date.Year == DateTime.Now.Date.Year) 
                {
                    maBaoCaoTon = bct.MaBaoCaoTon;
                }
            }

            if (maBaoCaoTon == 0) 
            {
                BAOCAOTON bct = new BAOCAOTON
                {
                    NgayBaoCao = DateTime.Now.Date
                };
                BaoCaoTonBUS.ThemBaoCaoTon(bct);
                maBaoCaoTon = bct.MaBaoCaoTon;
                List<SANPHAM> lstSP = SanPhamDAO.GetAllSanPham();
                if (lstSP != null)
                {
                    foreach (var item in lstSP)
                    {
                        CHITIETBAOCAOTON CTBCT = new CHITIETBAOCAOTON
                        {
                            MaBaoCaoTon = maBaoCaoTon,
                            MaSanPham = item.MaSanPham,
                            TonDauKy = item.SoLuongTon,
                            SoLuongBan = 0,
                            SoLuongMua = 0,
                            TonCuoiKy = item.SoLuongTon
                        };

                        ChiTietBaoCaoTonBUS.ThemChiTietBaoCaoTon(CTBCT);
                    }
                }
            }
            //Tạo mới phiếu nhập kho và insert vào csdl
            PHIEUNHAPKHO pnk = new PHIEUNHAPKHO()
            {
                MaNhanVien = CurrentUser.Instance.TaiKhoan.Id,//?
                NgayNhapKho = (DateTime)dpNgayLapPhieu.SelectedDate,
                TongTien = decimal.Parse(txtTongTien.Text)
            };

            if (PhieuNhapKhoBUS.ThemPhieuNhapKho(pnk) == false)
            {
                MessageBox.Show("Có lỗi xảy ra trong quá trình thêm phiếu.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            //Tạo mới các chi tiết phiếu nhập kho từ data grid và insert vào csdl
            foreach (PhieuNhapKhoData item in dataPNK)
            {
                CHITIETPHIEUNHAPKHO ctpnk = new CHITIETPHIEUNHAPKHO
                {
                    MaPhieuNhapKho = pnk.MaPhieuNhapKho,
                    MaSanPham = item.MaSanPham,
                    SoLuong = item.SoLuong,
                    DonGia = item.DonGia,
                    ThanhTien = item.ThanhTien
                };
                ctpnk.ThanhTien = ctpnk.DonGia * ctpnk.SoLuong;

                if(ChiTietPhieuNhapKhoBUS.ThemChiTietPhieuNhapKho(ctpnk)==false)
                {
                    MessageBox.Show("Có lỗi xảy ra trong quá trình thêm chi tiết phiếu.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                //Cập nhật lại số lượng tồn của sản phẩm
                //int slTon = (int)SanPhamDAO.GetAllSanPham().Where(m => m.MaSanPham == item.MaSanPham).Single().SoLuongTon;
                SANPHAM sp = SanPhamDAO.GetAllSanPham().Where(m => m.MaSanPham == item.MaSanPham).Single();
                sp.SoLuongTon += item.SoLuong;
                
                if(SanPhamBUS.CapNhatSanPham(sp)==false)
                {
                    MessageBox.Show("Có lỗi xảy ra trong quá trình cập nhật sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                //Thêm vào chi tiet báo cáo tồn
                List<CHITIETBAOCAOTON> lstCTBCT = ChiTietBaoCaoTonDAO.SelectAllChiTietBaoCaoTon();
                CHITIETBAOCAOTON CT = null;
                if(lstCTBCT != null)
                    foreach (var ct in lstCTBCT)
                    {
                        if (ct.MaBaoCaoTon == maBaoCaoTon && ct.MaSanPham == sp.MaSanPham)
                            CT = ct;
                    }
                if (CT != null)
                {
                    CT.TonDauKy += item.SoLuong;
                    CT.TonCuoiKy = CT.TonDauKy + CT.SoLuongMua - CT.SoLuongBan;
                    ChiTietBaoCaoTonBUS.CapNhatChiTietBaoCaoTon(CT);
                }

            }

            result = MessageBox.Show("Lập phiếu thành công. Bạn có muốn in phiếu hay không?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
            {
                this.ClearAll();
                return;
            }

            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
            sfd.Filter = "PDF File|*.pdf";
            sfd.FileName = "PNK_" + this.txtMaPhieu.Text;
            System.Windows.Forms.DialogResult r = sfd.ShowDialog();
            if (r == System.Windows.Forms.DialogResult.Cancel)
            {
                this.ClearAll();
                return;
            }

            ReportBUS.PhieuNhapKhoReport(pnk.MaPhieuNhapKho, sfd.FileName);
            MessageBox.Show("Đã in phiếu thành công.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);

            this.ClearAll();
        }

        private void btnTaoPhieuMoi_Click(object sender, RoutedEventArgs e)
        {
            ClearAll();
        }

        private void btnTraCuuSanPham_Click(object sender, RoutedEventArgs e)
        {
            TraCuuSanPham frmTraCuuSP = new TraCuuSanPham();
            frmTraCuuSP.ShowDialog();
        }

        private void btnThoat_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void txtDonGia_PreviewTextInput_1(object sender, TextCompositionEventArgs e)
        {
            int result;
            if (!(int.TryParse(e.Text, out result)))
            {
                e.Handled = true;
            }
        }

        private void dgPhieuNhapKho_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                var dataGrid = (DataGrid)sender;
                for (int i = 0; i < dataPNK.Count; i++)
                {
                    dataPNK.Remove((PhieuNhapKhoData)dataGrid.SelectedItem);
                }
                dgPhieuNhapKho.ItemsSource = null;
                dgPhieuNhapKho.ItemsSource = dataPNK;
                decimal tongTien = 0;
                foreach (PhieuNhapKhoData item in dataPNK)
                {
                    tongTien += item.ThanhTien;
                }

                txtTongTien.Text = String.Format("{0:0}", tongTien);                
            }
        }
    }
}
